package failover

import (
	"context"
	"errors"
	"fmt"
	"webook/internal/service/sms"
)

// FailOverSmsService 拥有失败处理的短信发送装饰器
type FailOverSmsService struct {
	svcs []sms.Service
}

func NewFailOverSmsService(svcs []sms.Service) *FailOverSmsService {
	return &FailOverSmsService{
		svcs: svcs,
	}
}

func (f *FailOverSmsService) Send(ctx context.Context, phone string, templateCode string, templateParam string) error {
	// 轮询实现
	for _, svc := range f.svcs {
		err := svc.Send(ctx, phone, templateCode, templateParam)
		if err != nil {
			// TODO：日志、监控
			fmt.Errorf("短信服务商出错: %w", err)
			// 切换下一个短信服务商
			continue
		}
		return nil
	}
	// 说明全部服务商出错
	// TODO：日志、监控
	return errors.New("发送失败，全部服务商都尝试过了")
}
